#include "uiadvancesearchdialog.h"
#include "uitoast.h"
#include <QPushButton>
#include <QListWidget>
#include <QLayout>

#include <QComboBox>
#include <QLineEdit>
#include <QLayout>
#include <QEvent>
#include <QMouseEvent>
/**
 * @brief 添加一个高级搜索条件项到列表中。
 * 
 * 此函数创建一个新的搜索条件项，并将其添加到高级搜索列表中。当添加按钮被点击时被调用。
 */
void UiAdvanceSearchDialog::addItem()
{
    // 创建一个新的列表项并设置其大小提示
    QListWidgetItem* item = new QListWidgetItem(m_listWidget);
    item->setSizeHint(QSize(0,50));
    
    // 创建并初始化搜索条件小部件
    auto itemWidget = new UiAdvanceSearchItemWidget(m_fieldList, this);
    
    // 连接搜索条件小部件的焦点获取事件到处理函数
    connect(itemWidget,&UiAdvanceSearchItemWidget::sigFocusIn,[=](bool bPressCtrl){
        if(bPressCtrl)
        {
            item->setSelected(true);
        }
        else{
            m_listWidget->clearSelection();
            item->setSelected(true);
        }
    });
    
    // 设置搜索条件小部件的高度并将其与列表项关联
    itemWidget->setFixedHeight(50);
    m_listWidget->setItemWidget(item,itemWidget);
}

/**
 * @brief 从列表中移除选中的高级搜索条件项。
 * 
 * 当删除按钮被点击时，此函数移除列表中所有被选中的搜索条件项。
 */
void UiAdvanceSearchDialog::removeItem()
{
    // 获取所有选中的列表项并遍历它们
    auto items = m_listWidget->selectedItems();
    for(int i = 0; i<items.size();++i)
    {
        auto item = items.at(i);
        
        // 从列表中移除项并删除它
        m_listWidget->takeItem(m_listWidget->row(item));
        delete item;
        item = nullptr;
    }
}

/**
 * @brief 设置高级搜索条件列表。
 * 
 * @param value 搜索条件列表，每个条件由字段名和对应的值组成。
 */
void UiAdvanceSearchDialog::setSearchList(const QList<QPair<QString, QString> > &value)
{
    searchList = value;
}

/**
 * @brief 获取当前设置的高级搜索条件列表。
 * 
 * @return 高级搜索条件列表，每个条件由字段名和对应的值组成。
 */
QList<QPair<QString, QString>> UiAdvanceSearchDialog::getSearchList() const
{
    return searchList;
}

/**
 * @brief 高级搜索对话框的构造函数。
 * 
 * @param fs 可选的字段列表，供用户在搜索条件中选择。
 * @param parent 父级QWidget。
 */
UiAdvanceSearchDialog::UiAdvanceSearchDialog(const QStringList &fs, QWidget *parent):UiConfirmDialog(parent),m_fieldList(fs)
{
    // 设置对话框标题和大小
    this->setWindowTitle("高级检索");
    this->setFixedSize(400,600);

    // 创建并初始化添加和删除按钮
    m_addBtn = new QPushButton("添加",this);
    connect(m_addBtn,&QPushButton::clicked,this,[=](){
       addItem();
   });

   m_removeBtn = new QPushButton("删除",this);
   connect(m_removeBtn,&QPushButton::clicked,this,[=](){
       removeItem();
   });

   // 创建并初始化搜索条件列表
   m_listWidget = new QListWidget(this);
   m_listWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
   m_listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);
   addItem();

   // 创建按钮布局并将其添加到对话框
   QHBoxLayout* btnLayout = new QHBoxLayout;
   btnLayout->addStretch(0);
   btnLayout->addWidget(m_addBtn);
   btnLayout->addWidget(m_removeBtn);

   QVBoxLayout* panelLayout = new QVBoxLayout;
   panelLayout->addLayout(btnLayout);
   panelLayout->addWidget(m_listWidget);

   this->addLayout(panelLayout);

    // 连接确认和取消按钮的信号
    connect(this,&UiConfirmDialog::sigConfirm,this,&UiAdvanceSearchDialog::slotConfirm);
    connect(this,&UiConfirmDialog::sigCancel,this,[=](){this->done(QDialog::Rejected);});
}

/**
 * @brief 确认按钮的点击处理函数。
 * 
 * 此函数收集并验证所有高级搜索条件，如果全部有效，则接受搜索条件并关闭对话框。
 */
void UiAdvanceSearchDialog::slotConfirm()
{
    QList<QPair<QString,QString>> searchList;
    auto count = m_listWidget->count();
    for(int i = 0;i<count;++i)
    {
        auto item = m_listWidget->item(i);
        auto itemWidget = dynamic_cast<UiAdvanceSearchItemWidget*>(m_listWidget->itemWidget(item));
        if(itemWidget)
        {
            if(itemWidget->text().isEmpty())
            {
                // 如果存在空的搜索条件，则显示提示信息并终止处理
                UiToast* toast = new UiToast(this);
                toast->setText("检索条件不能为空，请检查！");
                toast->show();
                return;
            }
            QPair<QString,QString> searchInfo(itemWidget->getField(),itemWidget->text());
            searchList<<searchInfo;
        }
    }

    setSearchList(searchList);

    this->done(QDialog::Accepted);
}

/**
 * @brief 高级搜索条件小部件的构造函数。
 * 
 * @param fs 可选的字段列表，供用户选择。
 * @param parent 父级QWidget。
 */
UiAdvanceSearchItemWidget::UiAdvanceSearchItemWidget(const QStringList &fs, QWidget *parent):QWidget(parent)
{
    // 初始化字段下拉框和文本编辑框
    m_fieldBox = new QComboBox(this);
    m_fieldBox->clear();
    m_fieldBox->addItems(fs);
    m_fieldBox->installEventFilter(this);

    m_edit = new QLineEdit(this);
    m_edit->installEventFilter(this);

    // 创建布局并添加控件
    QHBoxLayout* mainLayout = new QHBoxLayout(this);
    mainLayout->addWidget(m_fieldBox);
    mainLayout->addWidget(m_edit);
}

/**
 * @brief 获取当前选择的字段名。
 * 
 * @return 当前选择的字段名。
 */
QString UiAdvanceSearchItemWidget::getField()
{
    return m_fieldBox->currentText();
}

/**
 * @brief 获取字段文本框中的文本。
 * 
 * @return 文本框中的文本。
 */
QString UiAdvanceSearchItemWidget::text()
{
    return m_edit->text();
}

/**
 * @brief 事件过滤器，用于处理控件的鼠标事件。
 * 
 * @param watched 被监视的QObject。
 * @param event 发生的事件。
 * @return 如果事件被处理则返回true，否则返回false。
 */
bool UiAdvanceSearchItemWidget::eventFilter(QObject *watched, QEvent *event)
{
    // 当鼠标按下时，检查是否按下了Ctrl键
    if((watched == m_fieldBox || watched == m_edit) && event->type() == QEvent::MouseButtonPress)
    {
        bool bPressCtrl = false;
        QMouseEvent *mouseEvent = dynamic_cast<QMouseEvent*>(event);
        if (mouseEvent->modifiers() & Qt::ControlModifier) // 检查Ctrl键是否被按下
        {
            bPressCtrl = true;
        }
         emit sigFocusIn(bPressCtrl);
    }
    return false;
}
